package com.test.multithread.springBean.FactoryBeanTest;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;

import java.util.HashMap;
import java.util.Map;

public class App implements InitializingBean, FactoryBean<Object>, BeanNameAware, BeanFactoryAware, DisposableBean {
    private String says;
 
    private App(){
        System.out.println("App.App()");
    }
 
    public void say(){
        System.out.println("App.say()：" + says);
    }
 
    public String getSays() {
        return says;
    }
 
    public void setSays(String says) {
        this.says = says;
    }
 
    /**
     * 在get/set之后，在BeanPostProcessor的before方法之前执行
     */
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("App.setBeanFactory():" + beanFactory);
    }
 
    /**
     * 在get/set之后，在BeanPostProcessor的before方法之前执行
     */
    public void setBeanName(String name) {
        System.out.println("App.setBeanName():" + name);
    }
 
 
    /**
     * 在构造函数和get、set方法之后执行postProcessBeforeInitialization方法
     */
 
 
    /**
     * 这个方法是继承InitializingBean接口后，要实现的方法
     * 顾名思义，在属性设置之后进行的一些操作
     */
    public void afterPropertiesSet() throws Exception {
        System.out.println("App.afterPropertiesSet");
    }
 
    /**
     * 这个方法是spring中通过设置Init-method属性为该方法，然后才会执行。
     * 在afterPropertiesSet之后执行
     */
    public void initMethod(){
        System.out.println("App.initMethod");
    }
 
    /**
     *  FactoryBean测试
     */
    public Object getObject() throws Exception {
        System.out.println("App.getObject()");
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("test", "GetObject");
        return map;
    }
 
    public Class<?> getObjectType() {
        return new HashMap().getClass();
    }
 
    public boolean isSingleton() {
        return true;
    }
 
    /**
     *在afterPropertiesSet和initMethod方法之后执行postProcessAfterInitialization方法
     */
 
    /**
     * 在bean销毁阶段执行
     */
    public void destroy() throws Exception {
        System.out.println("App.destroy()");
    }
 
    public void destroyMethod() {
        System.out.println("App.destroyMethod()");
    }
}